home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / HAM_RAD / 3345.ZIP / SAMTSR.ASM < prev    next >
Assembly Source File  |  1988-06-06  |  5KB  |  140 lines

  1. PAGE ,132
  2.     TITLE SAMTSR
  3. ; -----------------------------------------------------------------------------
  4. ;    This is a sample TSR A/D converter driver for N6NKF's spectrum
  5. ;    analyzer program.  Add code to read samples from your A/D 
  6. ;    converter to make your own driver.
  7. ;
  8. ;    On entry, AX contains either -1 if this call is to set
  9. ;    the sample rate of your A/D converter hardware, or a positive number,
  10. ;    NUMSAM, if this    call is intended to return NUMSAM samples from the A/D.
  11. ;    NUMSAM may be as large as 1024.  The driver should buffer at least this
  12. ;    many samples, and be ready to deliver them to the calling program on
  13. ;    demand.
  14. ;
  15. ;    ES:BX contains a pointer to the address of the buffer, into which
  16. ;    we are supposed to place the A/D converter samples.
  17. ;
  18. ;    Suggest you replace the routines SETSAM and GETSAM with your own
  19. ;    code, but leave the routine intF1 as is.  SETSAM and GETSAM may
  20. ;    use any registers.
  21. ;
  22. ;    To build this program...    >  MASM samtsr;
  23. ;                    >  LINK samtsr;
  24. ;                    >  EXE2BIN samtsr.exe samtsr.com
  25. ;                    >  DEL samtsr.exe
  26. ;
  27. ; -----------------------------------------------------------------------------
  28.  
  29. cseg    segment    para public 'code'
  30.     org    100H        ;COM files must start at 100H
  31.     assume cs:cseg,ds:cseg
  32.  
  33.  
  34. ;Main routine.  This code executes once when you run the TSR.  It sets up
  35. ;interrupts, sets up your A/D converter hardware, then executes the DOS
  36. ;TSR (Terminate and Stay Resident) call.
  37.  
  38. TSR    proc    near        ;
  39.  
  40. ;  set F1 interrupt to vector to our interrupt routine...
  41.     mov    dx,offset cseg:intF1    ;addr of our interrupt handler
  42.     mov    ah,25H        ;set vector
  43.     mov    al,0F1H        ;for for our interrupt
  44.     int    21H        ;doscall
  45.  
  46. ;  do the DOS Terminate & Stay Resident function..
  47.     mov    ah,31H        ;TSR function
  48.     mov    al,0        ;success return code
  49.     mov    dx,offset cs:high_address    ;highest addr in program
  50.     add    dx,15        ;round up
  51.     mov    cl,4        ;cnvt to
  52.     shr    dx,cl        ;paragraphs
  53.     int    21H        ;doscall
  54. tsrend:    jmp    tsrend        ;the doscall should never return
  55.  
  56. TSR    ENDP
  57.  
  58. PAGE
  59. ; -----------------------------------------------------------------------------
  60. ;  Software interrupt handler for F1 interrupt.  This is the entry point
  61. ;  by which the spectrum analyzer calls the driver.
  62. ; -----------------------------------------------------------------------------
  63.  
  64. intF1    proc    far        ;
  65.     jmp    in2        ;jmp around identification words
  66.     dw    0FAFAH        ;this jmp and two id words expected by calling
  67.     dw    0FAFAH        ;pgm, and used to verify that TSR is present
  68.  
  69. in2:    push    ds        ;save critical registers
  70.     sti            ;reenable interrupts
  71.  
  72.     cmp    ax,-1        ;set sample rate call?
  73.     je    tsrssr        ;so go do it.
  74.  
  75.     call    getsam        ;invoke a routine to get some samples
  76.     jmp    intxit        ;and return
  77.  
  78. tsrssr:    call    setsam        ;invoke a routine to set sample rate
  79.  
  80. intxit:    pop    ds        ;restore
  81.     iret            ;and return
  82. intF1    endp            ;
  83.  
  84. PAGE
  85.  
  86. ; -----------------------------------------------------------------------------
  87. ;SETSAM -- routine to set sample rate...
  88. ; -----------------------------------------------------------------------------
  89.  
  90. setsam    proc    near        ;
  91.     mov    ax,es:[bx]    ;get sample rate
  92.     mov    dx,es:+1[bx]    ;get sample rate
  93. ;  now dx,ax contains the desired sample rate in units of samples 
  94. ;  per second.  insert instructions here which write this to your
  95. ;  hardware...
  96.  
  97.     ret            ;return
  98. setsam    endp
  99.  
  100.  
  101. PAGE
  102.  
  103. ; -----------------------------------------------------------------------------
  104. ;GETSAM -- routine to read samples into the input buffer...
  105. ;replace this with code which reads samples from your A/D converter.
  106. ;I urge you to use interrupts (or whatever mechanism) to allow this driver to
  107. ;read samples from your A/D converter while the spectrum analyzer program
  108. ;is computing.  When the program needs the next buffer of samples, it will
  109. ;call this driver, which will simply transfer a buffer of samples which have
  110. ;accumulated.  This overlapped processing allows the program to run much
  111. ;faster than a simple wait-for-the-samples-then-return approach.
  112. ; -----------------------------------------------------------------------------
  113.  
  114.  
  115. getsam    proc    near        ;
  116.     mov    cx,ax        ;#samples
  117.     mov    di,bx        ;destination address now in es:di
  118.     mov    si,offset samples  ;some example samples
  119.     mov    ax,cs           ;which are in code segment of course
  120.     mov    ds,ax           ;because this loads as a .COM program
  121.     cld            ;forward direction
  122.     rep    movsw        ;xfer buffer of samples to calling program
  123.     ret            ;return
  124. getsam    endp            ;
  125.  
  126. samples:            ;sample buffer which already contains
  127.                 ;some samples...
  128.     rept    1024/40+1    ;>1024 samples of a square wave
  129.     dw 20 dup ( 8192)
  130.     dw 20 dup (-8192)
  131.     endm
  132.  
  133.  
  134. high_address equ this byte    ;symbol for highest address used in the code
  135.                 ;segment (the only segment) in this TSR.
  136.                 ;allows DOS to know how much memory we need
  137.                 ;when we Terminate & Stay Resident
  138. cseg    ENDS
  139.     end tsr            ;specify entry point
  140.